import {
  accountLoginRequest,
  getUserInfoById,
  getUserMenusByRoleId
} from '@/service/login/login'
import { defineStore } from 'pinia'
import type { IAccount } from '@/types/index'
import { localCache } from '@/utils/cache'
import router from '@/router'

import { LOGIN_TOKEN } from '@/global/constants'
import { mapMenuListToPermissons, mapMenusToRoutes } from '@/utils/map-menus'
import useMainStore from '../main/main'
import useAnalysisStore from '../main/analysis/analysis'

// interface IUserInfo {
//   id: number
//   name: string
//   realname: string
//   enable: number
//   createAt: string
// }
interface ILoginState {
  token: string
  userInfo: any //服务器返回的类型 不想写啦，直接any 或者json  to ts 网站
  userMenus: any
  permissions: string[]
}
// pinia内部是包装的响应式的
const useLoginStore = defineStore('login', {
  //给state指定类型  不指定类型推导
  state: (): ILoginState => ({
    token: '',
    userInfo: {},
    userMenus: [],
    permissions: []
  }),

  actions: {
    //  1登录请求
    async loginAccountAction(account: IAccount) {
      const loginResult = await accountLoginRequest(account)
      const id = loginResult.data.id
      this.token = loginResult.data.token
      // 2 本地缓存 位置固定
      localCache.setCache(LOGIN_TOKEN, this.token)
      // console.log(localCache.getCache('token'))
      // 3 请求用户详细信息 前提有token
      const userInfoResult = await getUserInfoById(id)
      this.userInfo = userInfoResult.data
      // console.log(this.userInfo.role)
      // 4,根据用户角色获取权限 接口
      const userMenusResult = await getUserMenusByRoleId(this.userInfo.role.id)
      // console.log(userMenusResult)
      this.userMenus = userMenusResult.data

      // 5 本地缓存

      localCache.setCache('userMenus', this.userMenus)
      localCache.setCache('userInfo', this.userInfo)
      //  登录的时候请求所有角色和部门的数据
      const mainStore = useMainStore()
      mainStore.fetchEntireDataAction()
      // 6,获取登录用户的所有的按钮权限  菜单-》按钮权限
      const permissions: string[] = mapMenuListToPermissons(this.userMenus)
      this.permissions = permissions
      // 7,动态添加路由 抽取成工具函数
      // 根据自己的菜单映射成路由
      const routes = mapMenusToRoutes(this.userMenus)
      // console.log(routes)
      // 添加路由
      routes.forEach((route) => router.addRoute('main', route))
      // 根据菜单动态添加路由。
      // 1，获取菜单（userMenu）-代码写的位置
      // 2，动态获取所有路由对象（现在在独立的文件中）放在数组中，方便匹配
      // 3，根据菜单匹配正确路由， router.addRoute('main',xxx)
      // 所有路由  可以写死 （老师加入了自动化，难度上去啦，哈哈哈）
      // const localRoutes: RouteRecordRaw[] = []
      // // 1.1读取router/main所有ts文件 自动化的东西
      // const files: Record<string, any> = import.meta.glob(
      //   '../../router/main/**/*.ts',
      //   {
      //     eager: true
      //   }
      // )
      // // console.log(files)
      // for (const key in files) {
      //   const module = files[key]
      //   // 拿到每个文件导出的对象
      //   // console.log(module.default)
      //   localRoutes.push(module.default)
      // }
      // // console.log(localRoutes)
      // // 2 ,根据菜单匹配路由数组得到有的路径，router.addRoute('main',xxx)
      // for (const menu of this.userMenus) {
      //   for (const submenu of menu.children) {
      //     const route = localRoutes.find((item) => item.path === submenu.url)
      //     //  if(submenu.url === ){

      //     //  }
      //     if (route) {
      //       router.addRoute('main', route)
      //     }
      //   }
      // }
      // 页面跳转  主页
      router.push('/main')
    },
    // 加载本地数据
    loadLocalCacheAction() {
      // 用户进行刷新默认加载数据 要调用
      const token = localCache.getCache(LOGIN_TOKEN)
      const userInfo = localCache.getCache('userInfo')
      const userMenus = localCache.getCache('userMenus')
      if (token && userInfo && userMenus) {
        //有值 登录过后从本地取值 （严谨判断）
        this.token = token
        this.userInfo = userInfo
        this.userMenus = userMenus
        //6  按钮权限
        const permissions: string[] = mapMenuListToPermissons(this.userMenus)
        this.permissions = permissions
        // 动态添加路由
        const routes = mapMenusToRoutes(userMenus)

        routes.forEach((route) => router.addRoute('main', route))

        // 防止刷新数据丢失 登录的时候请求所有角色和部门的数据
        const mainStore = useMainStore()
        mainStore.fetchEntireDataAction()

        const AnalysisStore = useAnalysisStore()
        AnalysisStore.fechAnalysisDataAction()
      }
    }
  }
})

export default useLoginStore
